#ifndef _VL_RTSP_TCP_SERVER__H_
#define _VL_RTSP_TCP_SERVER__H_

#include "defs.h"
#include "utils/tcpsocket.h"
#include <thread>

namespace VLRTSP {

class TCPServer {

public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:05:45
	 * 
	 * TCP 服务器启动回调函数
	 */
	using ServerStartCallback = std::function<void()>;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:06:07
	 * 
	 * TCP 服务器关闭回调函数
	 */
	using ServerDoneCallback = std::function<void()>;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:05:03
	 * 
	 * 接收 Socket 回调函数
	 */
	using RecvSocketCallback = std::function<void(std::shared_ptr<TCPSocket>)>;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:16:01
	 * 
	 * 构造函数
	 * @param port 指定监听端口号
	 */
	explicit TCPServer(uint16_t port);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:16:26
	 * 
	 * 析构函数
	 */
	~TCPServer();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:06:41
	 * 
	 * 设置服务器启动回调函数
	 * @param callback 服务器启动回调函数
	 */
	void setServerStartCallback(ServerStartCallback callback);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:07:19
	 * 
	 * 设置服务器结束回调函数
	 * @param callback 服务器结束回调函数
	 */
	void setServerDoneCallback(ServerDoneCallback callback);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:08:49
	 * 
	 * 设置服务器接收 Socket 回调函数
	 * @param callback 服务器接收 Socket 回调函数
	 */
	void setRecvSocketCallback(RecvSocketCallback callback);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:17:05
	 * 
	 * 启动 TCP 服务器
	 */
	void start();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:17:16
	 * 
	 * 销毁 TCP 服务器
	 */
	void destroy();

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-11 14:26:24
	 * 
	 * 开始监听端口
	 * @return 如果监听成功返回 Socket，否则返回 -1
	 * 
	 * @note 需要跨平台支持的函数
	 */
	VL_SOCKET _listen();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-11 14:26:38
	 * 
	 * 销毁 TCPServer 监听
	 * 
	 * @note 需要跨平台支持的函数
	 */
	void _destroy();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-11 14:15:45
	 * 
	 * 接收 Socket
	 * @return Socket 指针
	 * 
	 * @note 需要跨平台支持的函数
	 */
	TCPSocket* _acceptSocket();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 17:47:31
	 * 
	 * 线程循环函数
	 */
	void _threadLoop();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 17:52:36
	 * 
	 * 判断当前是否在运行中
	 */
	volatile bool isRunning;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 17:23:16
	 * 
	 * 服务器套接字句柄
	 */
	VL_SOCKET serverFd;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:14:45
	 * 
	 * 监听端口号
	 */
	uint16_t port;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 17:45:21
	 * 
	 * 内部循环线程
	 */
	std::thread* thread;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-11 11:34:49
	 * 
	 * 回调锁
	 */
	std::mutex mutex;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:09:57
	 * 
	 * 服务器启动回调函数
	 */
	ServerStartCallback startCallback;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:10:13
	 * 
	 * 服务器结束回调函数
	 */
	ServerDoneCallback doneCallback;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 18:10:31
	 * 
	 * 服务器接收 Socket 回调函数
	 */
	RecvSocketCallback recvCallback;
};


}

#endif //_VL_RTSP_TCP_SERVER__H_
